package com.yuncheng.oaApi.service.impl;


import com.alibaba.fastjson.JSONObject;

import com.yuncheng.oaApi.entity.NkRsYszbczjl;
import com.yuncheng.oaApi.mapper.NkRsYszbczjlMapper;
import com.yuncheng.oaApi.service.INkRsXmyszbbService;
import com.yuncheng.oaApi.service.INkRsYszbczjlService;
import com.yuncheng.oaApi.service.INkRsYszbtzService;
import com.yuncheng.oaApi.service.IOaYcSysUserService;
import com.yuncheng.oaApi.utils.GetUuIdUtils;
import com.yuncheng.oaApi.utils.OaLocalFileUploadUtils;
import com.yuncheng.utils.ThreadContextHelper;
import com.yuncheng.vo.CurrentUserVo;
import com.yuncheng.oaApi.vo.CzjlVo;
import com.yuncheng.oaApi.vo.Result;

import org.apache.poi.hssf.usermodel.*;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Service;

import com.yuncheng.common.base.service.impl.BaseServiceImpl;

import org.springframework.util.StringUtils;
import utils.DateConversionUtils;


import javax.annotation.Resource;

import javax.servlet.http.HttpServletResponse;

import java.io.*;

import java.text.MessageFormat;
import java.util.*;






/**
 * @Description: 内控-预算指标操作记录
 * @Author: lhb
 * @Date: 2023-11-20
 * @Version: V1.0
 */
@Service
public class NkRsYszbczjlServiceImpl extends BaseServiceImpl<NkRsYszbczjlMapper, NkRsYszbczjl> implements INkRsYszbczjlService {

    @Resource
    @Lazy
    private NkRsYszbczjlMapper nkRsYszbczjlMapper;

    @Resource
    @Lazy
    private INkRsXmyszbbService nkRsXmyszbbService;

    @Resource
    @Lazy
    private INkRsYszbtzService nkRsYszbtzService;


    @Resource
    @Lazy
    private OaLocalFileUploadUtils oaLocalFileUploadUtils;


    @Resource
    @Lazy
    private IOaYcSysUserService sysUserService;

    /**
     * 操作记录
     *
     * @param czfs    操作方式
     * @param gldjid  关联单据id
     * @param zy      摘要
     * @param szlx    收支类型
     * @param czje    操作金额
     * @param yszbid  预算指标id
     * @param fystzid 预算台账id
     * @return
     */
    @Override
    public Result addczjl(String czfs, String gldjid, String zy, String szlx, String czje, String yszbid, String fystzid) {
        CurrentUserVo currentUser = ThreadContextHelper.getCurrentUser();
        NkRsYszbczjl nkRsYszbczjl = new NkRsYszbczjl();
        nkRsYszbczjl.setId(GetUuIdUtils.ReplaceUuId());

        nkRsYszbczjl.setFczsj(new Date()); //操作时间
        nkRsYszbczjl.setFczfs(czfs); //操作方式
        nkRsYszbczjl.setFgldjid(gldjid); //关联单据id
        nkRsYszbczjl.setFgldjzy(zy); //关联单据摘要
        nkRsYszbczjl.setFszlx(szlx); //收支类型
        nkRsYszbczjl.setFczje(czje); //操作金额
        nkRsYszbczjl.setFyszbid(yszbid); //预算指标id
        nkRsYszbczjl.setFyszbmc(nkRsXmyszbbService.getById(yszbid).getFysxmmc()); //预算指标名称
        nkRsYszbczjl.setFczr(currentUser.getName()); //操作人
        nkRsYszbczjl.setFczrid(currentUser.getId()); //操作人id
        nkRsYszbczjl.setFczbm(currentUser.getDeptName()); //操作部门
        nkRsYszbczjl.setFystzid(fystzid); //预算台账id
        nkRsYszbczjl.setFbmzcjjfl(nkRsXmyszbbService.getById(yszbid).getFbmjjflmc()); //部门支持经济名称

        nkRsYszbczjl.setFystzmc(nkRsYszbtzService.getById(fystzid).getFysxmmc());
        nkRsYszbczjl.setFnd(DateConversionUtils.DateToYear(new Date()));
        nkRsYszbczjlMapper.insert(nkRsYszbczjl);
        return Result.ok("插入成功");

    }

    @Override
    public Result addczjl(CzjlVo czjlVo) {
        CurrentUserVo currentUser = ThreadContextHelper.getCurrentUser();
        NkRsYszbczjl nkRsYszbczjl = new NkRsYszbczjl();
        nkRsYszbczjl.setId(GetUuIdUtils.ReplaceUuId());

        nkRsYszbczjl.setFczsj(new Date()); //操作时间
        nkRsYszbczjl.setFczfs(czjlVo.getFczfs()); //操作方式

        nkRsYszbczjl.setFgldjid(czjlVo.getFgldjid()); //关联单据id
        nkRsYszbczjl.setFgldjzy(czjlVo.getFzy()); //关联单据摘要
        nkRsYszbczjl.setFszlx(czjlVo.getFszlx()); //收支类型
        nkRsYszbczjl.setFczje(czjlVo.getFczje()); //操作金额
        nkRsYszbczjl.setFyszbid(czjlVo.getFyszbid()); //预算指标id
        nkRsYszbczjl.setFyszbmc(nkRsXmyszbbService.getById(czjlVo.getFyszbid()).getFysxmmc()); //预算指标名称
        nkRsYszbczjl.setFczr(currentUser.getName()); //操作人
        nkRsYszbczjl.setFczrid(currentUser.getId()); //操作人id
        nkRsYszbczjl.setFczbm(currentUser.getDeptName()); //操作部门
        nkRsYszbczjl.setFystzid(czjlVo.getFystzid()); //预算台账id
        nkRsYszbczjl.setFbmzcjjfl(nkRsXmyszbbService.getById(czjlVo.getFyszbid()).getFbmjjflmc()); //部门支持经济名称
        nkRsYszbczjl.setFbmzcjjbm(nkRsXmyszbbService.getById(czjlVo.getFyszbid()).getFbmjjflbm()); //部门支持经济分类编码
        nkRsYszbczjl.setFystzmc(nkRsYszbtzService.getById(czjlVo.getFystzid()).getFysxmmc()); //部门支持经济分类编码

        //报销人
        nkRsYszbczjl.setFbxr(czjlVo.getFbxr());
        //报销人id
        nkRsYszbczjl.setFbxrid(czjlVo.getFbxrid());
        //报销人部门
        nkRsYszbczjl.setFbxrbm(czjlVo.getFbxrbm());
        //报销人部门id
        nkRsYszbczjl.setFbxrbmid(czjlVo.getFbxrbmid());


        nkRsYszbczjl.setFskr(czjlVo.getFskr());
        nkRsYszbczjl.setFskrzh(czjlVo.getFskrzh());
        nkRsYszbczjl.setFskrzhkhh(czjlVo.getFskrzhkhh());
        nkRsYszbczjl.setFskrzhkhhszd(czjlVo.getFskrzhkhhszd());
        nkRsYszbczjl.setFsq(czjlVo.getFsq());
        nkRsYszbczjl.setFskrzjlx(czjlVo.getFskrzjlx());
        nkRsYszbczjl.setFskrzjhm(czjlVo.getFskrzjhm());

        nkRsYszbczjl.setFnd(DateConversionUtils.DateToYear(new Date()));
        nkRsYszbczjlMapper.insert(nkRsYszbczjl);
        return Result.ok("插入成功");

    }






        private static final String XLS = "xls", XLSX = "xlsx";
        /**
         * 指定某一个文件模板，把数据填入文件模板中，将填写后的文件下载
         * @param templatePath 模板文件的路径 包含文件名和类型
         * @param data 需要导出的数据
         * @param dataStartRow 开始填入数据的行号
         * @param fileConfig 字段配置
         *
         */
        public void exportUseExcelTemplate(
                String templatePath,
                List<?> data,
                Integer dataStartRow,
                JSONObject fileConfig,
                HttpServletResponse response
        ) throws IOException {
            // 获取Excel后缀名
            String fileType = templatePath.substring(templatePath.lastIndexOf(".") + 1, templatePath.length()).toLowerCase();
            if (Arrays.asList(XLS, XLSX).contains(fileType) == false) {
                throw new RuntimeException("文件后缀名不正确");

            }
            if (fileType.equals(XLS)) {
                HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(templatePath));
                HSSFSheet sheet = workbook.getSheetAt(0); //获取第1个数据表

                //构建每行数据
                /*for (Object dataItem : data) {
                    if(Objects.isNull(dataItem)) continue;
                    JSONObject dataItemJsonObject =  (JSONObject) JSONObject.toJSON(dataItem);
                    if(Objects.isNull(dataItemJsonObject)) continue;

                    //获取填入数据位置的开始行对象
                    HSSFRow row = sheet.getRow(dataStartRow);
                    if (row == null) {
                        // 创建新行
                        row = sheet.createRow(dataStartRow);
                    }
                    //循环字段
                    Integer finalDataStartRow = dataStartRow;
                    if (fileConfig == null){
                        throw new RuntimeException("文件配置为空");
                    }


                    for (Map.Entry<String, Object> entry : fileConfig.entrySet()) {
                        JSONObject valueJson = (JSONObject) entry.getValue();

                        String fieldData = dataItemJsonObject.getString(entry.getKey());
                        if (StringUtils.hasText(fieldData) == false) continue;

                        Integer columnIndex = valueJson.getInteger("columnIndex");
                        if (columnIndex == null) {
                            throw new RuntimeException("字段 " + entry.getKey() + " 的列号配置为空");
                        }

                        String fixedValue = valueJson.getString("fixedValue");
                        String valueToSet = StringUtils.hasText(fixedValue) ? fixedValue : fieldData;

                        if (StringUtils.hasText(valueToSet)) {
                            Cell cell = row.getCell(columnIndex);
                            if (cell == null) {
                                cell = row.createCell(columnIndex);
                            }
                            cell.setCellValue(valueToSet);
                            continue;
                        }


                        Boolean isPicFields = valueJson.getBoolean("isPicFields");
                        if (isPicFields) {
                            throw new RuntimeException("未支持图片");
                        }

                        JSONObject valueFormat = valueJson.getJSONObject("valueFormat");
                        if (!valueFormat.isEmpty()) {
                            String formatData = valueFormat.getString(fieldData);
                            row.getCell(columnIndex).setCellValue(formatData);
                            continue;
                        }

                        // 检查row是否为空，如果为空则创建新行
                        if (row == null) {
                            row = sheet.createRow(dataStartRow);
                        }

                        // 然后安全地设置单元格值
                        Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                        cell.setCellValue(fieldData);                    }


                    // 一行数据结束之后，继续下一行，行号+1
                    dataStartRow++;
                }*/

                for (Object dataItem : data) {
                    if (Objects.isNull(dataItem)) continue;
                    JSONObject dataItemJsonObject = (JSONObject) JSONObject.toJSON(dataItem);
                    if (Objects.isNull(dataItemJsonObject)) continue;

                    HSSFRow row = sheet.getRow(dataStartRow);
                    if (row == null) {
                        row = sheet.createRow(dataStartRow);
                    }

                    if (fileConfig == null) {
                        throw new RuntimeException("文件配置为空");
                    }

                    for (Map.Entry<String, Object> entry : fileConfig.entrySet()) {
                        JSONObject valueJson = (JSONObject) entry.getValue();
                        Integer columnIndex = valueJson.getInteger("columnIndex");
                        if (columnIndex == null) {
                            throw new RuntimeException("字段 " + entry.getKey() + " 的列号配置为空");
                        }

                        String fieldData = dataItemJsonObject.getString(entry.getKey());
                        String fixedValue = valueJson.getString("fixedValue");
                        String valueToSet = StringUtils.hasText(fixedValue) ? fixedValue : (StringUtils.hasText(fieldData) ? fieldData : "");

                        Cell cell = row.getCell(columnIndex, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK);
                        cell.setCellValue(valueToSet);

                        // 处理值格式化，如果配置存在的话
                        JSONObject valueFormat = valueJson.getJSONObject("valueFormat");
                        if (!valueFormat.isEmpty()) {
                            // 注意：此处逻辑取决于valueFormat如何具体应用到fieldData上，原代码直接尝试获取formatData可能不正确
                            // 应该有一个具体的格式化逻辑，这里假设是简单的字符串替换作为示例
                            String formatPattern = valueFormat.getString("pattern"); // 假设配置里有格式化模式
                            if (StringUtils.hasText(formatPattern)) {
                                cell.setCellValue(MessageFormat.format(formatPattern, valueToSet));
                            }
                        }
                    }

                    // 一行数据结束之后，继续下一行，行号+1
                    dataStartRow++;
                }

                // 设置文件输出头
                response.addHeader("Content-Disposition", "attachment;filename=" + System.currentTimeMillis() + ".xls");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");
                OutputStream out = null;
                try {
                    out = response.getOutputStream();
                    workbook.write(out);
                    out.close();
                } catch (IOException e) {
                    //  Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    out.close();
                }

            }else{
                XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(templatePath));
                XSSFSheet sheet = workbook.getSheetAt(0);//获取第1个数据表
                //构建每行数据
                for (Object dataItem : data) {
                    if (Objects.isNull(dataItem)) continue;
                    JSONObject dataItemJsonObject = (JSONObject) JSONObject.toJSON(dataItem);
                    if (Objects.isNull(dataItemJsonObject)) continue;

                    //获取填入数据位置的开始行对象
                    XSSFRow row = sheet.getRow(dataStartRow);

                    //循环字段
                    Integer finalDataStartRow = dataStartRow;
                    fileConfig.forEach((k, v)->{
                        JSONObject valueJson = (JSONObject) v;

                        String fieldData = dataItemJsonObject.getString(k);//取出当前字段的数据
                        if (StringUtils.hasText(fieldData) == false) return;

                        Integer columnIndex = valueJson.getInteger("columnIndex");//获取该字段对应的列号

                        // 判断是否存在固定值
                        String fixedValue = valueJson.getString("fixedValue"); //获取该字段对应的固定值
                        if(StringUtils.hasText(fixedValue)){
                            // 存在固定值，将固定值写入单元格
                            row.getCell(columnIndex).setCellValue(fixedValue);
                            return;
                        }
                        Boolean isPicFields = valueJson.getBoolean("isPicFields");//获取该字段是否属于图片
                        if(isPicFields){
                            throw new RuntimeException("未支持图片");
                        }

                        JSONObject valueFormat = valueJson.getJSONObject("valueFormat");//获取该字段是否存在值转换
                        if (valueFormat.isEmpty() == false){
                            //存在数值转换,根据数据库中的数据取出需要转换后的数据
                            String formatData = valueFormat.getString(fieldData); // 转换后的数据
                            // 将转换后的数据存入单元格
                            row.getCell(columnIndex).setCellValue(formatData);
                            return;
                        }

                        // 普通数据则直接存入单元格
                        row.getCell(columnIndex).setCellValue(fieldData);
                    });

                    // 一行数据结束之后，继续下一行，行号+1
                    dataStartRow++;
                }

                // 设置文件输出头
                response.addHeader("Content-Disposition", "attachment;filename=" + System.currentTimeMillis() + ".xls");
                response.setCharacterEncoding("UTF-8");
                response.setContentType("application/vnd.ms-excel;charset=UTF-8");

                OutputStream out = null;
                try {
                    out = response.getOutputStream();
                    workbook.write(out);
                    out.close();
                } catch (IOException e) {
                    //  Auto-generated catch block
                    e.printStackTrace();
                }finally {
                    out.close();
                }
            }
        }










}
